<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head></head>
<body>
The calculus of spans.

<p>A span is a <code>&lt;doc,startPosition,endPosition&gt;</code> tuple.</p>

<p>The following span query operators are implemented:

<ul>

<li>A <a href = "SpanTermQuery.html">SpanTermQuery</a> matches all spans
containing a particular <a href = "index/Term.html">Term</a>.</li>

<li> A <a href = "SpanNearQuery.html">SpanNearQuery</a> matches spans
which occur near one another, and can be used to implement things like
phrase search (when constructed from <a
href="SpanTermQuery.html">SpanTermQueries</a>) and inter-phrase
proximity (when constructed from other <a
href="SpanNearQuery.html">SpanNearQueries</a>).</li>

<li>A <a href = "SpanOrQuery.html">SpanOrQuery</a> merges spans from a
number of other <a href = "SpanQuery.html">SpanQueries</a>.</li>

<li>A <a href = "SpanNotQuery.html">SpanNotQuery</a> removes spans
matching one <a href = "SpanQuery.html">SpanQuery</a> which overlap
another.  This can be used, e.g., to implement within-paragraph
search.</li>

<li>A <a href = "SpanFirstQuery.html">SpanFirstQuery</a> matches spans
matching <code>q</code> whose end position is less than
<code>n</code>.  This can be used to constrain matches to the first
part of the document.</li>

</ul>

In all cases, output spans are minimally inclusive.  In other words, a
span formed by matching a span in x and y starts at the lesser of the
two starts and ends at the greater of the two ends.
</p>

<p>For example, a span query which matches "John Kerry" within ten
words of "George Bush" within the first 100 words of the document
could be constructed with:
<pre>
SpanQuery john   = new SpanTermQuery(new Term("content", "john"));
SpanQuery kerry  = new SpanTermQuery(new Term("content", "kerry"));
SpanQuery george = new SpanTermQuery(new Term("content", "george"));
SpanQuery bush   = new SpanTermQuery(new Term("content", "bush"));

SpanQuery johnKerry =
   new SpanNearQuery(new SpanQuery[] {john, kerry}, 0, true);

SpanQuery georgeBush =
   new SpanNearQuery(new SpanQuery[] {george, bush}, 0, true);

SpanQuery johnKerryNearGeorgeBush =
   new SpanNearQuery(new SpanQuery[] {johnKerry, georgeBush}, 10, false);

SpanQuery johnKerryNearGeorgeBushAtStart =
   new SpanFirstQuery(johnKerryNearGeorgeBush, 100);
</pre>

<p>Span queries may be freely intermixed with other Lucene queries.
So, for example, the above query can be restricted to documents which
also use the word "iraq" with:

<pre>
Query query = new BooleanQuery();
query.add(johnKerryNearGeorgeBushAtStart, true, false);
query.add(new TermQuery("content", "iraq"), true, false);
</pre>

</body>
</html>
